package br.com.pedrosilva.fv.util;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.Window;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Classe Utilitária utilizada por toda aplicação. Provê métodos utilitários
 * (static) que devem ser utilizados diretamente, sem a necessidade de
 * instanciar a classe.
 * 
 * @author Pedro C. Silva - 94665516553
 * 
 */
public class Util {

	/* Constantes */
	public static final String SEPARATOR;
	public static final String LINE_SEPARATOR;
	public static final String USER_HOME;
	public static final String HOUR_FORMAT = "HH:mm";
	public static final String DATE_FORMAT = "yyyyMMdd";
	public static final String DATE_TIME_FORMAT = "dd/MM/yyyy";
	public static final String DATE_TIME_FORMAT_LONG = "dd/MM/yyyy hh:mm:ss";

	/**
	 * Construtor Static.
	 */
	static {
		SEPARATOR = System.getProperty("file.separator");
		USER_HOME = System.getProperty("user.home");
		LINE_SEPARATOR = System.getProperty("line.separator");
	}

	/**
	 * Centraliza uma janela na tela.
	 * 
	 * @param w
	 *            Janela a ser centralizada.
	 */
	public static void centralize(Window w) {
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		Dimension objectSize = w.getSize();
		if (objectSize.height > screenSize.height) {
			objectSize.height = screenSize.height;
		}
		if (objectSize.width > screenSize.width) {
			objectSize.width = screenSize.width;
		}
		w.setLocation((screenSize.width - objectSize.width) / 2,
				(screenSize.height - objectSize.height) / 2);
	}

	/**
	 * Corrige uma extensão de arquivo. Se ao salvar um arquivo o usuário
	 * digitou a extensão, então o sistema irá considerar a extensão digitada.
	 * Caso contrário, o sistema ira considerar a extensão padrão.
	 * 
	 * @param fileName
	 *            Nome do arquivo.
	 * @param extension
	 *            Extensão do arquivo.
	 * @return Arquivo com extensão corrigida.
	 */
	public static String fixFileName(String fileName, String extension) {
		return (fileName.substring(fileName.length() - 4, fileName.length())
				.equals("." + extension)) ? fileName : fileName + "."
				+ extension;
	}

	/**
	 * Retorna a data atual no formato especificado em DATE_FORMAT.
	 * 
	 * @param format
	 *            Formato de conversão da data.
	 * @return String representando a data atual.
	 */
	public static String getDate(String format) {
		return getDate(format, new Date(System.currentTimeMillis()));
	}

	/**
	 * Retorna uma data num fomato específico.
	 * 
	 * @param format
	 *            Formato de conversão da data.
	 * @param date
	 *            Data a ser formatada.
	 * @return String representando a data.
	 */
	public static String getDate(String format, Date date) {
		return new SimpleDateFormat(format).format(date);
	}

	/**
	 * Retorna o caminho para a pasta Desktop do usuário. A pasta Desktop é
	 * geralmente localizada na home do usuário. Ex.: C:\Documents and
	 * Settings\CPF\Desktop\
	 * 
	 * @return
	 */
	public static String getDesktopFolder() {
		return USER_HOME + SEPARATOR + "Desktop" + SEPARATOR;
	}

	/**
	 * Retorna o nome de um arquivo ou pasta, a partir do seu path.
	 * 
	 * @param path
	 *            Path do arquivo ou pasta.
	 * @return Nome.
	 */
	public static String getFileName(String path) {
		return path.substring(path.lastIndexOf(SEPARATOR) + 1, path.length());
	}

	/**
	 * Obtém uma data a partir de uma String.
	 * 
	 * @param date
	 *            Data em formato de texto.
	 * @return Instância de Date.
	 * @throws ParseException
	 */
	public static Date parseDate(String date) throws ParseException {
		return new SimpleDateFormat(DATE_TIME_FORMAT_LONG).parse(date);
	}

	/**
	 * Obtém uma hora a partir de uma String
	 * 
	 * @param hour
	 *            Hora em formato de texto.
	 * @return Instância de Date.
	 * @throws ParseException
	 */
	public static Calendar parseHour(String hour) throws ParseException {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new SimpleDateFormat(HOUR_FORMAT).parse(hour));
		return cal;
	}

	/**
	 * Recorta um texto até um tamanho especificado.
	 * 
	 * @param text
	 *            Texto a ser recortado.
	 * @param size
	 *            Tamanho máximo do texto.
	 * @return Texto recortado.
	 */
	public static String trimToSize(String text, int size) {
		return (text.length() > size) ? text.substring(0, size) + "..."
				: text;
	}

	/**
	 * Construtor privado. Impede que a classe seja instanciada.
	 */
	private Util() {

	}
}
